﻿#pragma once
#include <QObject>
#include "component_data.h"


enum class MethodType {
	method_get = 1,
	method_post,
	method_put,
	method_max,
};

struct ServerRequestParam {		// 服务接口调用参数
	QStringList cmd;	// 命令字段
	MethodType method;	// 方式
	QByteArray data;	// 内容
};


class ComponentManager;
class ComponentBase : public QObject
{
	Q_OBJECT

public:
	ComponentBase(QObject* parent);
	virtual ~ComponentBase();
	QString GetComponentName();
	QString GetComponentErrMsg();
	Component GetComponentType();
	void SetVersion(const QString& version);
	QString GetVersion();

	/***************************************************
	* 初始化接口, 组件加载时调用
	* 返回值判断， 0：表示成功  -1表示失败，程序可以继续， -99表示严重失败，程序停止
	*************************************/
	virtual int Init();

	/***************************************************
	* 组件复位接口
	*
	*************************************/
	virtual bool Reset();

	/****************************************************************************
	 * 功能: 组件状态检查
	 * 传参:
	 * 返回值:
	 ****************************************************************************/
	virtual bool CheckState();
	// 订阅接口，提供给其它组件订阅本组件消息的接口
	virtual bool RegisterSubscriberFunction(int type, Callback callback)
	{
		return false;
	}

	// 命令执行接口
	virtual bool ExcuteCmd(int cmd, const QByteArray& input, QByteArray& output)
	{
		return false;
	}

	virtual void* GetPoint(const QString& id) { return nullptr;  }

	// 处理服务端信息， 用于处理机械手服务的请求信息
	virtual int ServerRequestProccess(const ServerRequestParam& param, QByteArray& ans)
	{
		return -4;
	}

protected:

	// 组件初始化处理函数
	virtual int ComponentInit() = 0;
	/*自检接口*/
	virtual bool ComponentCheckSelfState() = 0;
	/*复位接口*/
	virtual bool ComponentSelfReset() = 0;

	/****************************************************************************
	 * 功能: 生成错误信息，发布系统停止消息
	 * 传参: str: 错误信息描述
	 * 返回值:
	 ****************************************************************************/
	virtual  void SetErrmsg(const QString& str, bool send = true);

	/****************************************************************************
	 * 功能: 发布告警信息
	 * 传参: str: 错误信息描述
	 * 返回值:
	 ****************************************************************************/
	virtual void SetWarningmsg(const QString& str);

public slots:
	/*系统状态响应接口*/
	virtual void ResponseSystemState(int state) {}
signals:
	void PublishSystemEvent(int id, int eventid);
	void PublishWarningEvent(int id, const QString& msg);

protected:
	QString m_name;
	Component m_type = Component::component_max;
	QString m_version = "1.0.0";
	QString m_errmsg;
	ComponentManager* m_ob = nullptr;
};
